<!-- 

Promise承诺

什么是异步？

Promise的构造方法:
new Promise(function(resolve,reject){
构造方法里的内容立即执行,同步
resolve 解决,成功了
reject 抛弃,失败了
})
只有一个参数function,function里面有两个参数(形参)
* 不需要返回值,里面的内容是同步执行
函数返回值是promise实例

如果没有调用resolve()或reject(),promise就一直保持pending
调用之后：fulfilled 成功的结果   rejected 失败的原因

Promise状态的特点：
pending-进行中，初始状态，悬而未决
fullfilled-满足条件，成功
rejected-被抛弃，失败
promise的状态只能改变一次,且只能从pending->fullfilled或pending->rejected,没有其他转化的可能性


Promise的实例方法：

* 函数的内容异步执行

① .then()...然后

.then(函数1,函数2)
- 第一个函数处理Promise成功的时候
- 第二个函数处理Promise失败的时候
* 函数的内容异步执行
只写一个前面写undefined

.then()的返回值是一个新的promise实例:
- return,则新promise成功
- throw,则新promise失败


② promise.catch((e)=>{...})
等同 promise.then(undefined,(e)=>{...})

③ .finally(函数)用于最后做一些收尾工作,没有参数


 -->

<script>
  // const now=Date.now()//当前的时间戳，单位毫秒
  // console.log(now);
  // for(let i=0;i<10**9;i++){}
  // console.log(Date.now(),Date.now()-now);

  /*const now=Date.now()//当前的时间戳，单位毫秒
console.log(now);//A 1
setTimeout(()=>{
    console.log('延迟函数开始3');//C 5
    for(let i=0;i<10**9;i++){}
    console.log('延迟函数结束4');//D 6
},0)

console.log(Date.now(),Date.now()-now);//B 2


{
 const now=Date.now()//当前的时间戳，单位毫秒
 console.log('2',now);//E 3
 for(let i=0;i<10**9;i++){}
 console.log(Date.now(),Date.now()-now);//F 4
}


// Promise的构造方法:
new Promise(function(resolve,reject){
// 构造方法里的内容立即执行,同步
// resolve 解决,成功了
// reject 抛弃,失败了
})


const p=new Promise((resolve,reject)=>{
    if(Math.random()>0.5){
        console.log('成功');
        resolve('成功！')//成功的结果
    }else{
        console.log('失败');
        reject('失败！！！')//原因
    }
})




console.log(3);
const w=new Promise((resolve,reject)=>{
   //同步，立即执行 
  console.log(1);
  resolve('a')
  reject('b')
  console.log(2);
})
// 结果是成功，值是'a',里面的内容是同步执行
console.log(4);
//结果3 1 2 4


*/

  /*
Promise的实例方法：
 .then()...然后
 const p = new Promise((resolve, reject) => {
    setTimeout(
      () => {
       if (Math.random() > 0.0) {
         resolve('找到水')
       } else {
         reject('没有找到水。。。')
       }
      }, 0
    )
 })
 const p2 = p.then(
   (v) => {
     console.log('然后，成功：', v)
     console.log('测量水量')
     return 80
   },  fulfilled
   (e) => {console.log('然后，失败：', e)}   rejected
 )
 console.log(p2)

 let p3 = p2.then((v) => {
   if (v < 90) {
     throw ('太少了')  throw 是错误版本的return
   } else {
     return ('足够的水源')
   }
    return undefined
 })

 let p4 = p3.then(() => {
   return 'OK'
 })

 let p5 = p4.then(undefined, (msg) => {
   console.log(msg, '其实80水也够')  错误被解决了，所以下一步成功
   return true
 })
*/

  function delay(ms, cb) {
    setTimeout(cb, ms);
  }
  delay(1000, function () {
    //  console.log('hello');
  });
  delay(1000, function () {
    console.log("hello");
    delay(2000, function () {
      console.log("world");
      delay(500, function () {
        console.log("今天");
        delay(500, function () {
          console.log("的");
          delay(500, function () {
            console.log("天气");
            delay(500, function () {
              console.log("不错");
              delay(500, function () {
                console.log("啊");
              });
            });
          });
        });
      });
    });
  });

  // promise函数：返回promise对象的函数
  function delay2(ms) {
    return new Promise(function (resolve) {
      setTimeout(resolve, ms);
    });
  }
  delay2(1000)
    .then(() => {
      console.log("hello2");
      return delay2(2000);
    })
    .then(() => {
      console.log("world2");
      return delay2(500);
    })
    .then(() => {
      console.log("今天");
      return delay2(500);
    })
    .then(() => {
      console.log("的");
      return delay2(500);
    })
    .then(() => {
      console.log("天气");
      return delay2(500);
    })
    .then(() => {
      console.log("不错");
      return delay2(500);
    })
    .then(() => {
      console.log("啊");
      // return delay2(500)
    });

  new Promise((resolve, reject) => {
    resolve(1);
  })
    .then(
      (value) =>
        new Promise((resolve, reject) => {
          resolve(value + 10);
        })
    )
    .then((value) => console.log(value)); //11

  new Promise((resolve, reject) => {
    reject(Math.random());
  })
    .catch((value) => {
      if (value > 0.5) {
        return 1;
      } else {
        throw 2;
      }
    })
    .then((value) => console.log("then:", value))
    .catch((value) => console.log("catch", value));

  new Promise((resolve, reject) => {
    resolve();
  })
    .then(() => {
      console.log("启动一些资源");
    })
    .then(() => {
      console.log("...做了一些其他的事");
      if (Math.random() > 0.5) {
        return 1;
      } else {
        throw 2;
      }
    })
    .finally(() => {
      console.log("离开，收拾好");
    });
</script>
